import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';
import { CreateDictTypesDto } from './dto/create-dict-types.dto';
import { FindAllDictTypesDto } from './dto/find-all-dict-types.dto';
import { UpdateDictTypesDto } from './dto/update-dict-types.dto';

@Injectable()
export class DictTypesService {
  constructor(private prisma: PrismaService) {}
  /**
   * 此 TypeScript 函数根据查询对象异步查找所有字典类型，并返回类型列表以及总数。
   * @param {FindAllDictTypesDto} query - 您提供的 `findAll` 函数是一个异步函数，它根据提供的查询参数检索字典类型的列表。以下是函数中使用的参数的解释：
   * @returns `findAll` 函数返回一个具有两个属性的对象：`list` 和 `total`。`list`
   * 属性包含符合查询条件的字典类型的数组，每个字典类型都有特定的字段（id、name、status、code、remark）。`total` 属性包含符合查询条件的字典类型的总数。
   */
  async findAll(query: FindAllDictTypesDto) {
    const queryWhere = {
      name: {
        contains: query?.keywords,
      },
    };
    const [types, count] = await this.prisma.$transaction([
      this.prisma.dictType.findMany({
        where: queryWhere,
        orderBy: {
          id: 'desc',
        },
        skip: (query.pageNum - 1) * query.pageSize,
        take: query.pageSize,
        select: {
          id: true,
          name: true,
          status: true,
          code: true,
          remark: true,
        },
      }),
      this.prisma.dictType.count({
        where: queryWhere,
      }),
    ]);

    return {
      list: types,
      total: count,
    };
  }

  /**
   * 根据给定的ID查找并返回表单信息。
   * @param id 表单的唯一标识符。
   * @returns 返回一个包含表单ID、名称、备注、代码和状态的对象。
   */
  findForm(id: number) {
    // 使用Prisma客户端查询特定ID的表单信息，选择性地只返回ID、名称、备注、代码和状态字段。
    return this.prisma.dictType.findUnique({ where: { id }, select: { id: true, name: true, remark: true, code: true, status: true } });
  }

  /**
   * 该函数在检查数据库中是否已存在字典类型后，创建一个新的字典类型。
   * @param {CreateDictTypesDto} body - 您提供的“create”函数是一个异步函数，它使用 Prisma 在数据库中创建一个新的字典类型。
   * @returns `create` 方法返回使用 `prisma.dictType.create` 方法和提供的 `body` 数据创建新字典类型的结果。
   */
  async create(body: CreateDictTypesDto) {
    // 检查字典类型是否已经存在
    const existingDictType = await this.prisma.dictType.findFirst({
      where: { name: body.name },
    });

    if (existingDictType) {
      throw new Error('字典类型已经存在'); // 如果字典类型名称已经存在，抛出一个错误
    }

    // 如果字典类型不存在，那么创建新字典类型
    return this.prisma.dictType.create({
      data: body,
    });
  }

  /**
   * 更新字典类型的数据。
   * @param id 字典类型的唯一标识符。
   * @param data 包含更新内容的对象。
   * @returns 返回更新后的字典类型数据。
   */
  update(id: number, data: UpdateDictTypesDto) {
    // 使用Prisma客户端更新指定ID的字典类型数据
    return this.prisma.dictType.update({
      where: {
        id,
      },
      data,
    });
  }

  /**
   * 根据提供的ID数组删除多个字典类型记录。
   * @param ids 要删除的记录的ID数组。
   * @returns 返回Prisma客户端的删除操作承诺，指示成功删除的记录数。
   */
  removeMany(ids: number[]) {
    // 使用提供的ID数组，在Prisma客户端上调用deleteMany操作
    return this.prisma.dictType.deleteMany({
      where: {
        id: {
          in: ids,
        },
      },
    });
  }
}
